home *** CD-ROM | disk | FTP | other *** search
- package Text::ParseWords;
-
- require 5.000;
- use Carp;
-
- require AutoLoader;
- *AUTOLOAD = \&AutoLoader::AUTOLOAD;
-
- require Exporter;
- @ISA = qw(Exporter);
- @EXPORT = qw(shellwords quotewords);
- @EXPORT_OK = qw(old_shellwords);
-
- =head1 NAME
-
- Text::ParseWords - parse text into an array of tokens
-
- =head1 SYNOPSIS
-
- use Text::ParseWords;
- @words = "ewords($delim, $keep, @lines);
- @words = &shellwords(@lines);
- @words = &old_shellwords(@lines);
-
- =head1 DESCRIPTION
-
- "ewords() accepts a delimiter (which can be a regular expression)
- and a list of lines and then breaks those lines up into a list of
- words ignoring delimiters that appear inside quotes.
-
- The $keep argument is a boolean flag. If true, the quotes are kept
- with each word, otherwise quotes are stripped in the splitting process.
- $keep also defines whether unprotected backslashes are retained.
-
- A &shellwords() replacement is included to demonstrate the new package.
- This version differs from the original in that it will _NOT_ default
- to using $_ if no arguments are given. I personally find the old behavior
- to be a mis-feature.
-
- "ewords() works by simply jamming all of @lines into a single
- string in $_ and then pulling off words a bit at a time until $_
- is exhausted.
-
- =head1 AUTHORS
-
- Hal Pomeranz (pomeranz@netcom.com), 23 March 1994
-
- Basically an update and generalization of the old shellwords.pl.
- Much code shamelessly stolen from the old version (author unknown).
-
- =cut
-
- 1;
- __END__
-
- sub shellwords {
- local(@lines) = @_;
- $lines[$#lines] =~ s/\s+$//;
- "ewords('\s+', 0, @lines);
- }
-
-
-
- sub quotewords {
-
-
- my ($delim, $keep, @lines) = @_;
- my (@words, $snippet, $field);
-
- local $_ = join ('', @lines);
-
- while (length) {
- $field = '';
-
- for (;;) {
- $snippet = '';
-
- if (s/^"([^"\\]*(\\.[^"\\]*)*)"//) {
- $snippet = $1;
- $snippet = qq|"$snippet"| if $keep;
- }
- elsif (s/^'([^'\\]*(\\.[^'\\]*)*)'//) {
- $snippet = $1;
- $snippet = "'$snippet'" if $keep;
- }
- elsif (/^["']/) {
- croak 'Unmatched quote';
- }
- elsif (s/^\\(.)//) {
- $snippet = $1;
- $snippet = "\\$snippet" if $keep;
- }
- elsif (!length || s/^$delim//) {
- last;
- }
- else {
- while (length && !(/^$delim/ || /^['"\\]/)) {
- $snippet .= substr ($_, 0, 1);
- substr($_, 0, 1) = '';
- }
- }
-
- $field .= $snippet;
- }
-
- push @words, $field;
- }
-
- return @words;
- }
-
-
- sub old_shellwords {
-
-
- local($_) = join('', @_);
- my(@words,$snippet,$field);
-
- s/^\s+//;
- while ($_ ne '') {
- $field = '';
- for (;;) {
- if (s/^"(([^"\\]|\\.)*)"//) {
- ($snippet = $1) =~ s#\\(.)#$1#g;
- }
- elsif (/^"/) {
- croak "Unmatched double quote: $_";
- }
- elsif (s/^'(([^'\\]|\\.)*)'//) {
- ($snippet = $1) =~ s#\\(.)#$1#g;
- }
- elsif (/^'/) {
- croak "Unmatched single quote: $_";
- }
- elsif (s/^\\(.)//) {
- $snippet = $1;
- }
- elsif (s/^([^\s\\'"]+)//) {
- $snippet = $1;
- }
- else {
- s/^\s+//;
- last;
- }
- $field .= $snippet;
- }
- push(@words, $field);
- }
- @words;
- }
-